package com.hsl.housaileibot001.config;

import lombok.Getter;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

/**
 * 统一的 HTTP 客户端配置类
 * 支持 HTTP/2 协议，配置所有 AI 请求接口
 *
 * @author liul
 * @date 2025/01/27
 */
@Configuration
public class HttpClientConfig {

    @Value("${bailing.api-token:}")
    private String bailingApiToken;

    @Bean
    public OkHttpClient okHttpClient(PerformanceMetrics performanceMetrics) {
        // 优化连接池配置：更多并发连接，更长的空闲时间保活
        ConnectionPool connectionPool = new ConnectionPool(
                200,                    // 最大空闲连接数（增加以支持更多并发）
                10,                     // 空闲连接保活时间（增加到10分钟）
                TimeUnit.MINUTES
        );

        // 配置请求分发器，优化并发性能
        Dispatcher dispatcher = new Dispatcher();
        dispatcher.setMaxRequests(200);           // 最大请求数
        dispatcher.setMaxRequestsPerHost(20);     // 每个主机最大请求数

        // 创建性能监控拦截器
        Interceptor performanceInterceptor = chain -> {
            long startTime = System.currentTimeMillis();
            okhttp3.Request request = chain.request();
            String url = request.url().toString();

            try {
                okhttp3.Response response = chain.proceed(request);
                long duration = System.currentTimeMillis() - startTime;

                // 记录性能指标
                performanceMetrics.recordRequest(url, duration, response.isSuccessful());
                return response;
            } catch (Exception e) {
                long duration = System.currentTimeMillis() - startTime;
                performanceMetrics.recordRequest(url, duration, false);
                throw e;
            }
        };

        // 构建 OkHttpClient，启用 HTTP/2 和性能优化
        return new OkHttpClient.Builder()
                .connectionPool(connectionPool)
                .dispatcher(dispatcher)
                // 超时配置优化：减少连接超时，快速失败
                .connectTimeout(15, TimeUnit.SECONDS)   // 连接超时15秒（减少等待时间）
                .readTimeout(30, TimeUnit.SECONDS)      // 读超时30秒
                .writeTimeout(30, TimeUnit.SECONDS)     // 写超时30秒
                .callTimeout(60, TimeUnit.SECONDS)      // 总调用超时60秒
                .retryOnConnectionFailure(true)                 // 连接失败重试
                .pingInterval(30, TimeUnit.SECONDS)     // 定期 ping 保活连接
                // 添加性能监控拦截器
                .addNetworkInterceptor(new PerformanceInterceptor())
                // 添加 PerformanceMetrics 拦截器
                .addInterceptor(performanceInterceptor)
                .build();
        // OkHttp 3.7+ 默认启用 HTTP/2 协议
    }

    /**
     * 配置白凌 SDK 的 HTTP 客户端为 HTTP/2
     * 通过自定义 HttpClientConfig 实现
     */
    @Bean
    @ConditionalOnProperty(name = "ai2.provider", havingValue = "bailing")
    public cn.tbox.sdk.core.http.HttpClientConfig bailingHttpClientConfig(OkHttpClient okHttpClient) {
        // 创建自定义的 HttpClientConfig，使用 OkHttp HTTP/2 客户端
        return new BailingOkHttpClientConfig(bailingApiToken, okHttpClient);
    }

    /**
     * 自定义白凌 HttpClientConfig，使用 OkHttp HTTP/2 客户端
     */
    @Getter
    public static class BailingOkHttpClientConfig extends cn.tbox.sdk.core.http.HttpClientConfig {
        /**
         * -- GETTER --
         * 返回配置的 OkHttp 客户端（支持 HTTP/2）
         */
        private final OkHttpClient okHttpClient;

        public BailingOkHttpClientConfig(String apiToken, OkHttpClient okHttpClient) {
            super(apiToken);
            this.okHttpClient = okHttpClient;
        }

    }
}
